package graphs;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * Class for the vertices of a graph
 * @author Ballarini Robin
 * @version 16/12/2013
 * @param <T> type of the element stored in the edges of the graph
 * @param <E> type of the element stored in the vertices of the graph
 */
public class Vertex<T extends Comparable<T>,E> {
	
	/** Identifiant du noeud*/
	private E id;
	
	/** Position du noeud dans la liste du graphe*/
	private int position;
	
	/** Liste d'incidence, contient les aretes incidentes a this*/
	private ArrayList<Edge<T,E>> inc;
	
	
	/** Enregistrer le Cluster dans lequel est le noeud */
	private HashMap<Vertex<T,E>,Object> cl;
	public HashMap<Vertex<T,E>,Object> getCluster(){
		return this.cl;
		}
	public void addCluster(HashMap<Vertex<T,E>,Object> cl){ 
		this.cl = cl;
		}
	
	/**
	 * Constructeur
	 * @param id identifiant du noeud
	 * @param pos position du noeud dans la liste du graphe
	 */
	public Vertex(E id,int pos) {
		this.id=id;
		this.position=pos;
		this.inc=new ArrayList<Edge<T,E>>();
	}
	
	/**
	 * Construteur
	 * @param id identifiant du noeud
	 * @param position position du noeud dans la liste du graphe
	 * @param inc liste d'incidence du noeud
	 */
	public Vertex(E id,int position, ArrayList<Edge<T,E>> inc){
		this.id=id;
		this.position=position;
		this.inc=inc;
	}
	
	/**
	 * @return l'identifiant de this
	 */
	public E getID(){
		return id;
	}
	
	/**
	 * remplace l'identifiant de this
	 * @param i le nouvel identifiant
	 */
	public void setID(E i){
		id=i;
	}
	
	/**
	 * @return le degre du noeud (=nombre d'aretes incidentes)
	 */
	public int getOrder(){
		return inc.size();
	}
	
	/**
	 * @return la liste d'incidence de this
	 */
	public List<Edge<T,E>> getInc(){
		return inc;
	}
	
	/**
	 * remplace la liste d'incidence de this
	 * @param n la nouvelle liste d'incidence
	 */
	public void setInc(ArrayList<Edge<T,E>> n){
		inc=n;
	}
	
	/**
	 * @param n une arete
	 * @return true si n incidente a this, false sinon
	 */
	public boolean incidentTo(Edge<T,E> n){
		return inc.contains(n);
	}
	
	/**
	 * @return la position de this dans la liste du graphe
	 */
	public int getPosition(){
		return position;
	}
}
